<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 1. 定义一个含有30个整型元素的数组，按顺序分别赋予从2开始的偶数；然后按顺序每五个数求出一个平均值，放在另一个数组中并输出。试编程。 */
      function fn1() {
        var arr = [];

        // 将2开始的偶数持续不断地丢入arr 直到arr的长度够30
        for (var i = 2; arr.length < 30; i += 2) {
          arr.push(i);
        }
        console.log(arr);

        /* 5个元素一组求平均值 */
        // 放置平均值的数组

        var avgArr = [];

        // 求元素的和
        var sum = 0;

        for (var i = 0; i < arr.length; i++) {
          // 将当前元素丢入总和中
          sum += arr[i];

          // 只要满5个元素（下标4 9 14 19） 就立刻求一下平均值
          if ((i + 1) % 5 === 0) {
            avgArr.push(sum / 5);
            sum = 0;
          }
        }

        console.log(avgArr);
      }
      //   fn1();

      /* 通过循环按执行顺序，做一个5×5的二维数组，赋1到25的自然数，然后输出该数组的左下半三角。试编程。 */
      function fn2() {
        var bigArr = [];
        var smallArr = [];
        for (var i = 1; i <= 25; i++) {
          smallArr.push(i);
          if (smallArr.length === 5) {
            //   当前小数组地址丢入大数组
            bigArr.push(smallArr); //bigArr[0] = smallArr

            // 小数组重新指向一片新建堆内存（与上一次的小数组脱钩）
            smallArr = [];
          }
        }
        console.log(bigArr);

        bigArr.forEach(
          // 从当前小数组中输出前index+1项
          function (sa, index) {
            for (var i = 0; i < index + 1; i++) {
              document.write(sa[i] + "&nbsp;&nbsp;");
            }
            document.write("<br>");
          }
        );
      }
      //   fn2()

      /* 随机生成一个五位以内的数，然后输出该数共有多少位，每位分别是什么 */
      function fn3() {
        var num = parseInt(Math.random() * 100000);
        console.log(num);

        var str = num.toString();
        console.log("%s共有%s位", num, num.toString().length);

        for (var i = 0; i < str.length; i++) {
          console.log(str[i]);
        }
      }
      //   fn3();

      /* 编写函数map(arr) 把数组中的每一位数字都增加30%，并返回一个新数组 */
      function fn4() {
        function map(arr = []) {
          return arr.map(function (item) {
            return item * 1.3;
          });
        }
        console.log(map([10, 100, 1000]));
      }
      //   fn4()

      /* 编写函数has(arr , 60) 判断数组中是否存在60这个元素，返回布尔类型 */
      function fn5() {
        function has(arr, item) {
          return arr.indexOf(item) !== -1;
        }
        console.log(has([1, 2, 3], 3));
        console.log(has([1, 2, 3], 6));
      }
      // fn5()

      /* 编写函数norepeat(arr) 将数组的重复元素去掉，并返回新的数组 */
      function fn6() {
        function noRepeat(arr = []) {
          var nrArr = [];

          arr.forEach(function (item, index) {
            if (arr.indexOf(item) === index) {
              nrArr.push(item);
            }
          });

          return nrArr;
        }

        function noRepeatX(arr = []) {
          /* 对arr中的元素进行过滤 item如果首次出现则通过过滤进入newArr */
          var newArr = arr.filter(function (item, index) {
            //   如果item系首次出现 则通过过滤
            return arr.indexOf(item) === index;
          });

          return newArr;
        }

        console.log(noRepeatX([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8]));
      }
      //   fn6();

      /* 有一个从小到大排好序的数组。现输入一个数，要求按原来的规律将它插入数组中。 */
      function fn7() {
        var arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3];
        arr.sort(function (a, b) {
          return a - b;
        });
        console.log(arr);

        function insert(arr, item) {
          // 先判断arr是否升序
          var asc = arr[arr.length - 1] >= arr[0] ? true : false;

          // 先看是否应该插在头
          if ((asc && item <= arr[0]) || (!asc && item >= arr[0])) {
            arr.unshift(item);
          }

          // 先看是否应该插在尾
          if (
            (asc && item >= arr[arr.length - 1]) ||
            (!asc && item <= arr[arr.length - 1])
          ) {
            arr.push(item);
          }

          // 插在中间i位 item一定位于arr[i-1],arr[i+1]之间
          for (var i = 1; i < arr.length - 1; i++) {
            var before = arr[i - 1];
            var after = arr[i];
            console.log(i, before, after);

            if (
              (asc && item >= before && item <= after) ||
              (!asc && item <= before && item >= after)
            ) {
              // 将item插入i位
              arr.splice(i, 0, item);

            //   任务完成 退出循环（否则arr的长度已经发生变化）
              break;
            }
          }

          console.log(arr);
        }

        insert(arr, -3.5);
        insert(arr, 13.5);
        insert(arr, 3.5);
      }
    //   fn7();

    function fn7X(){
        function insert(arr,item){
            // 先将item丢入arr
            arr.push(item)

            // 再按原来的排序规则
            return arr.sort(
                // 当初arr中的末位元素大于首位元素
                arr[arr.length-2]>=arr[0]
                ?
                function(a,b){return a-b}//当初是升序规则
                :
                function(a,b){return b-a}//当初是降序规则
            )
        }

        var arr = [0,1,2,3,4,5,6,7,8,9]

        console.log(insert(arr,-3));
        console.log(insert(arr,13));
        console.log(insert(arr,3.5));
    }
    // fn7X()
    </script>
  </body>
</html>
